﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using iNet.Collections;
using iNet.Media.Imaging.Exif;
using iNet.Media.Xmp;

namespace iNet.Media.Imaging
{
	/// <summary>
	/// 適用於 TIFF 及 JPEG 影像的中繼資料。
	/// </summary>
	public class TiffMetadata : HybridImageMetadata, IExifMetadata, IXmpMetadata
	{
		#region 欄位
		XmpImageMetadata _XmpMetadata;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 TiffMetadata 執行個體。
		/// </summary>
		public TiffMetadata()
			: this(null, false)
		{ }
		/// <summary>
		/// 初始化新的 TiffMetadata 執行個體。
		/// </summary>
		/// <param name="template">範本中繼資料。</param>
		/// <param name="isReadonly">是否為唯讀。</param>
		public TiffMetadata(IMetadata template, bool isReadonly)
			: this(new ExifImageMetadata(), new XmpImageMetadata(), template, isReadonly)
		{ }
		/// <summary>
		/// 初始化新的 TiffMetadata 執行個體。
		/// </summary>
		/// <param name="exifTags">EXIF Tag 列表。</param>
		/// <param name="xmpProperties">XMP Property 列表。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		public TiffMetadata(IEnumerable<ExifTag> exifTags, IEnumerable<XmpProperty> xmpProperties, bool isReadOnly)
			: this(new ExifImageMetadata(exifTags, isReadOnly), new XmpImageMetadata(xmpProperties, isReadOnly), isReadOnly)
		{ }
		/// <summary>
		/// 初始化新的 TiffMetadata 執行個體。
		/// </summary>
		/// <param name="exifMetadata">提供 EXIF 中繼資料儲存的 IExifMetadata 介面。</param>
		/// <param name="xmpMetadata">提供 XMP 中繼資料儲存的 IXmpMetadata 介面。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		public TiffMetadata(IExifMetadata exifMetadata, IXmpMetadata xmpMetadata, bool isReadOnly)
			: this(exifMetadata, xmpMetadata, null, isReadOnly)
		{ }
		/// <summary>
		/// 初始化新的 TiffMetadata 執行個體。
		/// </summary>
		/// <param name="exifMetadata">提供 EXIF 中繼資料儲存的 IExifMetadata 介面。</param>
		/// <param name="xmpMetadata">提供 XMP 中繼資料儲存的 IXmpMetadata 介面。</param>
		/// <param name="template">範本中繼資料。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		public TiffMetadata(IExifMetadata exifMetadata, IXmpMetadata xmpMetadata, IMetadata template, bool isReadOnly)
			: base(new IMetadata[] { exifMetadata, xmpMetadata, }, template, isReadOnly)
		{ }
		#endregion
		#region Clone
		/// <summary>
		/// 建立可修改的 TiffMetadata 副本。
		/// </summary>
		/// <returns>TiffMetadata 副本。</returns>
		public override object Clone()
		{
			return new TiffMetadata(this.ExifTags, this.XmpProperties, false);
		}
		#endregion
		#region ExifTags
		/// <summary>
		/// 取得 EXIF Tag 集合。
		/// </summary>
		public IList<ExifTag> ExifTags
		{
			get
			{
				IExifMetadata metadata = (this.Sources[0] as IExifMetadata);
				return (metadata != null ? metadata.ExifTags : new ExifTag[0]);
			}
		}
		#endregion
		#region GetAsReadOnly
		/// <summary>
		/// 建立唯讀版本的 TiffMetadata。
		/// </summary>
		/// <returns>唯讀版本的 TiffMetadata。</returns>
		public override IMetadata GetAsReadOnly()
		{
			if (this.IsReadOnly)
				return this;
			return new TiffMetadata(this.Sources[0] as IExifMetadata, this.Sources[1] as IXmpMetadata, true);
		}
		#endregion
		#region XmpProperties
		/// <summary>
		/// 取得原始 XMP Property 集合。
		/// </summary>
		public IList<XmpProperty> XmpProperties
		{
			get
			{
				IXmpMetadata metadata = (this.Sources[1] as IXmpMetadata);
				return (metadata != null ? metadata.XmpProperties : new XmpProperty[0]);
			}
		}
		#endregion
	}
}
